iT邦幫忙

2021 iThome 鐵人賽

DAY 4
1

抱歉,今天太累了,腦袋昏沉沉的,快速地寫完一個矩形就快睡著了 (~O~),所以今天的內容會非常短...

今日目標

  • 畫出第一個"矩"形

OpenGL是一個狀態機

OpenGL的底層是一個狀態機!

忘記是從哪邊找到的,但這句話對我來說,間接了解了為什麼OpenGL的AP會是長這樣。

最好理解的這句話的就是看OpenGL1.1的API,如果要話一個圖形的話,會是這樣寫(沒記錯的話):

glBegin(GL_NICE_SHAPE);
// set the positons, color data here...
glEnd();

就像這樣,一層層設定,最後在glEnd的時候繪出,雖說我使用的是OpenGL3,但也沒有改變他的架構。

下面直接先貼上一段code:

// the first rectangle...
    static const float VERTICES[] = {
		0.5f,  0.5f,  	// top right
     	0.5f, -0.5f,  	// bottom right
    	-0.5f, -0.5f,  	// bottom left
    	-0.5f,  0.5f, 	// top left 
	};

	static const unsigned int INDICES[] = {
		0, 1, 3,   
    	1, 2, 3
	};

	unsigned int vbo, vao, ibo;

	glGenVertexArrays(1, &vao);
	glBindVertexArray(vao);

	glGenBuffers(1, &vbo);
	glBindBuffer(GL_ARRAY_BUFFER, vbo);
	glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES), VERTICES, GL_STATIC_DRAW);

	glGenBuffers(1, &ibo);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(INDICES), INDICES, GL_STATIC_DRAW);

        glVertexAttribPointer(RENDER_2D_CONTEXT.default_shader.attribs_locations[SHADER_ATTRIB_VEC2_POS], 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(RENDER_2D_CONTEXT.default_shader.attribs_locations[SHADER_ATTRIB_VEC2_POS]);

	glUseProgram(RENDER_2D_CONTEXT.default_shader.id);
	glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

	glBindVertexArray(0);

這個片段其實就是在實作:
如何產生Buffer存儲頂點資料(Vertex Buffer Object)與頂點的繪畫順序(Element Buffer Object) -> 綁定資料
-> 驅動Shader -> 畫在螢幕上。

誕生!第一個矩形


這邊就直接把程過貼上來了,沒多餘的力氣講解我最甚麼了

參考

  • [Learn OpenGL - Shaders][https://learnopengl.com/Getting-started/Shaders]

最後,這是今天的github


上一篇
[Day3] 驅動OpenGL
下一篇
[Day5] 第一章貼圖
系列文
翻車機率極高的2D平台遊戲(2D Platformer)製作33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言